package com.fandou.speech.asr.baidu;

import android.content.Context;
import android.util.Log;

import com.baidu.aip.asrwakeup3.core.recog.MyRecognizer;
import com.baidu.aip.asrwakeup3.core.recog.listener.IRecogListener;
import com.baidu.aip.asrwakeup3.core.recog.listener.MessageStatusRecogListener;
import com.baidu.aip.asrwakeup3.core.recog.params.OfflineRecogParams;

import java.util.Map;

/**
 * 识别activity 主要逻辑。
 * ActivityUiRecog为UI部分，不必细看
 */
public class BaseRecognizer extends AbstractRecognizer implements MessageStatusRecogListener.OnAsrListener {

    /**
     * 识别控制器，使用MyRecognizer控制识别的流程
     */
    protected MyRecognizer myRecognizer;

    /*
     * 本Activity中是否需要调用离线命令词功能。根据此参数，判断是否需要调用SDK的ASR_KWS_LOAD_ENGINE事件
     */
    protected boolean enableOffline;

    private static final String TAG = "BaseRecognizer";

    private MessageStatusRecogListener.OnAsrListener onAsrListener;

    /**
     * @param enableOffline 展示的activity是否支持离线命令词
     */
    public BaseRecognizer(Context context, boolean enableOffline) {
        super(context);
        this.enableOffline = enableOffline;
    }

    @Override
    public void initialAsr(Context context) {
        super.initialAsr(context);
        // 基于DEMO集成第1.1, 1.2, 1.3 步骤 初始化EventManager类并注册自定义输出事件
        // DEMO集成步骤 1.2 新建一个回调类，识别引擎会回调这个类告知重要状态和识别结果
        IRecogListener listener = new MessageStatusRecogListener(this);
        // DEMO集成步骤 1.1 1.3 初始化：new一个IRecogListener示例 & new 一个 MyRecognizer 示例,并注册输出事件
        myRecognizer = new MyRecognizer(context, listener);
        if (enableOffline) {
            // 基于DEMO集成1.4 加载离线资源步骤(离线时使用)。offlineParams是固定值，复制到您的代码里即可
            Map<String, Object> offlineParams = OfflineRecogParams.fetchOfflineParams();
            myRecognizer.loadOfflineEngine(offlineParams);
        }

        // BluetoothUtil.start(this,BluetoothUtil.FULL_MODE); // 蓝牙耳机开始，注意一部分手机这段代码无效
    }

    /**
     * 开始录音，点击“开始”按钮后调用。
     * 基于DEMO集成2.1, 2.2 设置识别参数并发送开始事件
     */
    protected void start(Map<String, Object> params, MessageStatusRecogListener.OnAsrListener onAsrListener) {
        // params 也可以根据文档此处手动修改，参数会以json的格式在界面和logcat日志中打印
        Log.i(TAG, "设置的start输入参数：" + params);
        // 复制此段可以自动检测常规错误
//        (new AutoCheck(context, new Handler(Looper.getMainLooper()) {
//            public void handleMessage(Message msg) {
//                if (msg.what == 100) {
//                    AutoCheck autoCheck = (AutoCheck) msg.obj;
//                    synchronized (autoCheck) {
//                        String message = autoCheck.obtainErrorMessage(); // autoCheck.obtainAllMessage();
//                        Log.w("AutoCheckMessage", message);
//                    }
//                }
//            }
//        }, enableOffline)).checkAsr(params);

        this.onAsrListener = onAsrListener;
        // 这里打印出params， 填写至您自己的app中，直接调用下面这行代码即可。
        // DEMO集成步骤2.2 开始识别
        myRecognizer.start(params);
    }

    /**
     * 开始录音后，手动点击“停止”按钮。
     * SDK会识别不会再识别停止后的录音。
     * 基于DEMO集成4.1 发送停止事件 停止录音
     */
    protected void stop() {
        myRecognizer.stop();
    }

    /**
     * 开始录音后，手动点击“取消”按钮。
     * SDK会取消本次识别，回到原始状态。
     * 基于DEMO集成4.2 发送取消事件 取消本次识别
     */
    protected void cancel() {
        myRecognizer.cancel();
    }

    /**
     * 销毁时需要释放识别资源。
     */
    protected void release() {
        Log.i(TAG, "release");
        // 如果之前调用过myRecognizer.loadOfflineEngine()， release()里会自动调用释放离线资源
        // 基于DEMO5.1 卸载离线资源(离线时使用) release()方法中封装了卸载离线资源的过程
        // 基于DEMO的5.2 退出事件管理器
        myRecognizer.release();
    }

    @Override
    public void onAsrBegin() {
        if (onAsrListener != null) {
            onAsrListener.onAsrBegin();
        }
    }


    @Override
    public void onAsrEnd() {
        if (onAsrListener != null) {
            onAsrListener.onAsrEnd();
        }
    }

    @Override
    public void updateVolume(int volumePercent, int volume) {
        if (onAsrListener != null) {
            onAsrListener.updateVolume(volumePercent, volume);
        }
    }

    @Override
    public void onAsrResult(String res) {
        if (onAsrListener != null) {
            onAsrListener.onAsrResult(res);
        }
    }

    @Override
    public void onAsrError(int errorCode, int subErrorCode, String errorMsg) {
        if (onAsrListener != null) {
            onAsrListener.onAsrError(errorCode, subErrorCode, errorMsg);
        }
    }

    @Override
    public void onAsrOnlineNluResult(String nluResult) {
        if (onAsrListener != null) {
            onAsrListener.onAsrOnlineNluResult(nluResult);
        }
    }
}
